<?php
final class App_Controller
{
    /**
		сам объект Фронт Контроллера
     */
    private static $instance;
    static public function GetInstance ()
    {
        if (! (self::$instance instanceof self)) self::$instance = new self();
        return self::$instance;
    }
    private function __construct ()
    {
    	$locale = Mozg_Cfg::Get('global')->GetLocale();
		putenv('LANG='.$locale);
		putenv('LANGUAGE='.$locale);
    	setlocale(LC_ALL, $locale);
    	setlocale(LC_NUMERIC, 'C');

    	//set timezone
        Mozg::Lib('date')->SetTimeZone(Mozg_Cfg::Get('global')->GetTimeZone());
        Mozg_Lang::Required('default');
    }
    /**
		устанавливаем нужный протокол
     */
    private function GetProtocol ()
    {
        if ($_SERVER['DOCUMENT_ROOT'])
        {
            return 'http';
        }
        else
        {
            return 'std';
        }
    }
    /**
		устанавливаем нужный постфикс
     */
    private function GetEnv($protocol)
    {
        $_request = Mozg::Request($protocol);
        if ('http' == $protocol)
        {
        	list($requestUri) = explode('?', $_request->getRequestUri());
        	if (Mozg::Lib('Dir')->TestExtension($requestUri, 'xml'))
        	{
        		return 'xml';
        	}
            else if ($_request->isXmlHttpRequest() || $_request->has('ajax'))
            {
                return 'ajax';
            }
            else
            {
                return 'web';
            }
        }
        else
        {
            return 'cli';
        }
    }

    /**
		запуск
	*/
    public function Run ()
    {
        $protocol = $this->GetProtocol();
		$env = $this->GetEnv($protocol);

		list($moduleName, $ctrlName, $actionName) = Mozg_Router::Get($protocol)->GetActiveRoute();

		$module = Mozg::Module($moduleName, $protocol, $env);

		try
		{
			$module->Init();
			$module->Auth();

			if ((false !== $ctrlName) && !strlen($ctrlName)) $ctrlName = false;
			else if (false === $ctrlName) $ctrlName = '';

			$actionName .= 'Pr';
			$module->GetCtrl($ctrlName, $protocol, $env)->$actionName();
		}
		catch (Exception $e)
		{
			Mozg::ExceptionHandler($module->GetName(), $protocol, $env)->Handle($e);
		}

		Mozg::Layout($moduleName)->Run();
        Mozg::Response($protocol)->SendResponse();
    }
}